﻿//
// ParallelGrep
//
// Copyright (C) 2011 - Tatsuya Niioka
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Media.Imaging;

namespace ParallelGrep.Model
{
    /// <summary>
    /// メニュー情報クラス
    /// </summary>
    /// <typeparam name="T">タイプ</typeparam>
    public class MenuInfo<T> : INotifyPropertyChanged
    {
        #region DisplayName
        private string m_displayName;
        /// <summary>
        /// 表示名を取得または設定します。
        /// </summary>
        public string DisplayName
        {
            get
            {
                return m_displayName;
            }
            set
            {
                if (m_displayName == value)
                {
                    return;
                }
                m_displayName = value;
                OnPropertyChanged("DisplayName");
            }
        }
        #endregion

        #region Value
        private T m_value;
        /// <summary>
        /// 値を取得または設定します。
        /// </summary>
        public T Value
        {
            get
            {
                return m_value;
            }
            set
            {
                if (m_value != null && m_value.Equals(value))
                {
                    return;
                }
                m_value = value;
                OnPropertyChanged("Value");
            }
        }
        #endregion

        #region BitmapSource
        private BitmapSource m_bitmapSource;
        /// <summary>
        /// イメージを取得します。
        /// </summary>
        public BitmapSource BitmapSource
        {
            get
            {
                return m_bitmapSource;
            }
            private set
            {
                m_bitmapSource = value;
                OnPropertyChanged("BitmapSource");
            }
        }
        #endregion

        #region IsChecked
        private bool m_isChecked = false;
        /// <summary>
        /// チェック状態を取得または設定します。
        /// </summary>
        public bool IsChecked
        {
            get
            {
                return m_isChecked;
            }
            set
            {
                if (m_isChecked == value)
                {
                    return;
                }
                m_isChecked = value;
                OnPropertyChanged("IsChecked");
            }
        }
        #endregion

        #region IsEnabled
        private bool m_isEnabled = true;
        /// <summary>
        /// 有効状態を取得または設定します。
        /// </summary>
        public bool IsEnabled
        {
            get
            {
                return m_isEnabled;
            }
            set
            {
                if (m_isEnabled == value)
                {
                    return;
                }
                m_isEnabled = value;
                OnPropertyChanged("IsEnabled");
            }
        }
        #endregion

        #region Constructor
        /// <summary>
        /// 指定したファイル名、パス、イメージ、チェック状態で新しい<see cref="MenuInfo&lt;T&gt;"/>クラスを生成します。
        /// </summary>
        /// <param name="displayName">表示名</param>
        /// <param name="value">値</param>
        /// <param name="bitmapSource">イメージ</param>
        public MenuInfo(string displayName, T value, BitmapSource bitmapSource)
        {
            DisplayName = displayName;
            Value = value;
            BitmapSource = bitmapSource;
        }
        #endregion

        #region INotifyPropertyChanged
        /// <summary>
        /// プロパティ変更イベント
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// 指定したプロパティでプロパティを変更します。
        /// </summary>
        /// <param name="propertyName">プロパティ名</param>
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion

    }
}
